function muti(num) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(num * num);
    }, 1000);
  });
}

const nums = [1, 2, 3];

// 一秒后打印出 1,4,9
nums.forEach(async (i) => {
  const res = await muti(i);

  console.log(res);
});

// 一秒后打印出 1,4,9
for (let i = 0; i < nums.length; i++) {
  setTimeout(() => {
    console.log(nums[i] * nums[i]);
  }, 1000);
}

// 打印 1 ，过1秒打印出 4 ， 再过1秒打印出 9

!(async () => {
  for (let i of nums) {
    const res = await muti(i);

    console.log(res);
  }
})();

// 这样也行，不管i 是 let 定义的，还是 var 定义的，都能达到效果
!(async () => {
  for (var i = 0; i < nums.length; i++) {
    const res = await muti(nums[i]);

    console.log(res);
  }
})();

// 打印 1 , 过 1 秒 打印 出 4 ， 再过 1 秒 打印出 9

function cb(index) {
  if (index > nums.length) {
    return;
  }

  setTimeout(() => {
    console.log(index * index);

    cb(index + 1);
  }, 1000);
}

cb(1);

// 不用 async 和 await 的解决方案
// then 函数是先执行，循环的 then 函数都执行完毕之后，再执行回调函数

for (let i = 1, promise = muti(1); i <= 3; i++) {
  promise = promise.then((data) => {
    console.log(data);

    return muti(i + 1);
  });
}
